<?php

namespace app\admin\model\scanwork;

use think\Model;

class ProductItem extends Model
{
    // 表名
    protected $name = 'scanwork_product_item';
    
    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'int';

    // 定义时间戳字段名
    protected $createTime = 'createtime';
    protected $updateTime = 'updatetime';
    protected $deleteTime = false;

    // 追加属性
    protected $append = [
        'status_text',
    ];
    
    public function getStatusList()
    {
        return ['0' => __('未报工'), '1' => __('已报工'), '2' => __('已审核')];
    }

    public function getStatusTextAttr($value, $data)
    {
        $value = $value ? $value : (isset($data['status']) ? $data['status'] : '');
        $list = $this->getStatusList();
        return isset($list[$value]) ? $list[$value] : '';
    }

    // 关联分工分配
    public function allocation()
    {
        return $this->belongsTo('app\admin\model\scanwork\Allocation', 'allocation_id', 'id');
    }

    // 关联报工记录
    public function report()
    {
        return $this->belongsTo('app\admin\model\scanwork\Report', 'report_id', 'id');
    }

    // 关联审核人
    public function auditUser()
    {
        return $this->belongsTo('app\common\model\User', 'audit_user_id', 'id');
    }

    // 关联报工图片
    public function reportImages()
    {
        return $this->hasMany('ItemReportImage', 'item_id', 'id');
    }

    // 关联审核图片
    public function auditImages()
    {
        return $this->hasMany('ItemAuditImage', 'item_id', 'id');
    }

    /**
     * 生成产品编号
     * @param int $allocationId 分工分配ID
     * @param string $prefix 编号前缀
     * @param int $quantity 数量
     * @return array 生成的编号列表
     */
    public static function generateItemNos($allocationId, $prefix, $quantity)
    {
        $itemNos = [];
        
        // 获取当前分工分配的信息
        $allocation = \think\Db::name('scanwork_allocation')->where('id', $allocationId)->find();
        if (!$allocation) {
            throw new \Exception('分工分配不存在');
        }
        
        // 检查同一个订单、同一个产品型号、同一个工序内的编号唯一性
        $existingNos = \think\Db::name('scanwork_product_item')
            ->alias('pi')
            ->join('scanwork_allocation a', 'pi.allocation_id = a.id')
            ->where('a.order_id', $allocation['order_id'])
            ->where('a.model_id', $allocation['model_id'])
            ->where('a.process_id', $allocation['process_id'])
            ->column('pi.item_no');
        
        $currentNumber = 1;
        $generatedCount = 0;
        
        while ($generatedCount < $quantity) {
            $itemNo = $prefix . str_pad($currentNumber, 4, '0', STR_PAD_LEFT);
            
            // 如果编号在同一个订单、产品、工序内已存在，继续查找下一个可用编号
            if (!in_array($itemNo, $existingNos)) {
                $itemNos[] = $itemNo;
                $generatedCount++;
            }
            
            $currentNumber++;
        }
        
        return $itemNos;
    }

    /**
     * 批量创建产品编号记录
     * @param int $allocationId 分工分配ID
     * @param array $itemNos 编号列表
     * @return bool
     */
    public static function createItems($allocationId, $itemNos)
    {
        // 获取当前分工分配的信息
        $allocation = \think\Db::name('scanwork_allocation')->where('id', $allocationId)->find();
        if (!$allocation) {
            throw new \Exception('分工分配不存在');
        }
        
        // 检查同一个订单、同一个产品型号、同一个工序内的编号唯一性
        $existingNos = \think\Db::name('scanwork_product_item')
            ->alias('pi')
            ->join('scanwork_allocation a', 'pi.allocation_id = a.id')
            ->where('a.order_id', $allocation['order_id'])
            ->where('a.model_id', $allocation['model_id'])
            ->where('a.process_id', $allocation['process_id'])
            ->where('pi.item_no', 'in', $itemNos)
            ->column('pi.item_no');
            
        if (!empty($existingNos)) {
            throw new \Exception('同一个订单、产品、工序中产品编号已存在: ' . implode(', ', $existingNos));
        }
        
        $data = [];
        foreach ($itemNos as $itemNo) {
            $data[] = [
                'allocation_id' => $allocationId,
                'item_no' => $itemNo,
                'status' => 0,
                'createtime' => time(),
                'updatetime' => time()
            ];
        }
        
        return self::insertAll($data);
    }

    /**
     * 更新产品编号状态
     * @param array $itemNos 编号列表
     * @param int $status 状态
     * @param int $reportId 报工ID
     * @param int $auditUserId 审核人ID
     * @return bool
     */
    public static function updateItemsStatus($itemNos, $status, $reportId = null, $auditUserId = null)
    {
        $updateData = [
            'status' => $status,
            'updatetime' => time()
        ];
        
        if ($reportId !== null) {
            $updateData['report_id'] = $reportId;
        }
        
        if ($auditUserId !== null) {
            $updateData['audit_user_id'] = $auditUserId;
            $updateData['audit_time'] = time();
        }
        
        return self::where('item_no', 'in', $itemNos)->update($updateData);
    }
} 